/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GUI;

import Facade.Facade;
import Objetos.Dia;
import Objetos.Movimentacao;
import Objetos.Usuario;
import Objetos.ValoresFixos;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author celio
 */
public final class Caixa extends JPanel {

    JLabel descricao, tipo, valor;
    JLabel statusDia, dataAtual, tTotal;
    JTextField tDescricao, tValor;
    JButton inserir, excluir, gravar, abrir, fechar, imprimir, limpar;
    JComboBox tTipo;
    String tipos[] = {"", "Saída", "Entrada"};
    Vector linhas, cabecalho;
    JTable entradas;
    DefaultTableModel dtm;
    JScrollPane scroller;
    Calendar data;
    Movimentacao mov;
    ImageIcon imageIncluir = new ImageIcon("Icones\\incluir.png");
    ImageIcon imageExcluir = new ImageIcon("Icones\\excluir.png");
    ImageIcon imageSalvar = new ImageIcon("Icones\\salvar.png");
    ImageIcon imageFechar = new ImageIcon("Icones\\fechar.png");
    ImageIcon imageAbrir = new ImageIcon("Icones\\abrir.png");
    ImageIcon imageImprimir = new ImageIcon("Icones\\imprimir.png");
    Facade fa;
    Dia ultimoDia;

    public Caixa(final Usuario usu) {

        JLabel tela = new JLabel("... :::   Caixa  ::: ...");
        tela.setBounds(400, 10, 500, 20);
        add(tela);

        data = Calendar.getInstance();

        dataAtual = new JLabel(data.getTime().toLocaleString().substring(0, 10));
        statusDia = new JLabel();
        statusDia.setForeground(Color.red);
        tTotal = new JLabel("");
        tipo = new JLabel("Tipo: ");
        tTipo = new JComboBox(tipos);

        valor = new JLabel("Valor: ");
        tValor = new JTextField(10);

        inserir = new JButton();
        inserir.setIcon(imageIncluir);
        inserir.setToolTipText("Incluir");
        excluir = new JButton();
        excluir.setIcon(imageExcluir);
        excluir.setToolTipText("Excluir");
        gravar = new JButton();
        gravar.setIcon(imageSalvar);
        gravar.setToolTipText("Salvar");
        fechar = new JButton();
        fechar.setIcon(imageFechar);
        fechar.setToolTipText("Fechar Caixa");
        abrir = new JButton();
        abrir.setIcon(imageAbrir);
        abrir.setToolTipText("Abrir Caixa");
        imprimir = new JButton();
        imprimir.setIcon(imageImprimir);
        imprimir.setToolTipText("Imprimir");

        descricao = new JLabel("Descrição: ");
        valor = new JLabel("Valor: ");
        tipo = new JLabel("Tipo: ");
        tDescricao = new JTextField();
        tValor = new JTextField();
        tTipo = new JComboBox(tipos);
        cabecalho = new Vector();
        linhas = new Vector();
        

        cabecalho.addElement("Data");
        cabecalho.addElement("Decrição");
        cabecalho.addElement("Valor");
        cabecalho.addElement("Tipo");

        entradas = new JTable(linhas, cabecalho);
        entradas.setFont(new Font("Times New Roman", Font.BOLD, 14));
        dtm = (DefaultTableModel) entradas.getModel();
        scroller = new JScrollPane(entradas, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        entradas.getColumnModel().getColumn(0).setPreferredWidth(200);
        entradas.getColumnModel().getColumn(1).setPreferredWidth(400);
        entradas.getColumnModel().getColumn(2).setPreferredWidth(200);
        entradas.getColumnModel().getColumn(3).setPreferredWidth(200);

        descricao.setBounds(10, 10, 80, 20);
        valor.setBounds(10, 40, 80, 20);
        tipo.setBounds(10, 70, 80, 20);
        tDescricao.setBounds(80, 10, 200, 20);
        tValor.setBounds(80, 40, 80, 20);
        tTotal.setBounds(515, 100, 80, 20);
        tTipo.setBounds(80, 70, 150, 20);
        scroller.setBounds(10, 130, 600, 300);
        inserir.setBounds(610, 130, 50, 50);
        excluir.setBounds(610, 180, 50, 50);
        fechar.setBounds(760, 80, 50, 50);
        abrir.setBounds(700, 80, 50, 50);
        imprimir.setBounds(820, 80, 50, 50);
        dataAtual.setBounds(720, 10, 300, 20);
        statusDia.setBounds(300, 50, 600, 20);

        abrir.setEnabled(false);
        fechar.setEnabled(false);
        imprimir.setEnabled(false);

        add(descricao);
        add(valor);
        add(tTotal);
        add(tipo);
        add(tDescricao);
        add(tValor);
        add(tTipo);
        add(scroller);
        add(inserir);
        //add(excluir);
        add(imprimir);
        add(fechar);
        add(abrir);
        add(dataAtual);
        add(statusDia);

        situacaoDia(usu);

        inserir.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                mov = new Movimentacao();
                fa = new Facade();
                Dia dia = fa.verificarUltimoDia_Dia(usu);

                mov.setTipo(tTipo.getSelectedItem().toString());
                mov.setDescricao(tDescricao.getText());
                String valorAjustado = null;
                try {
                    valorAjustado = Funcoes.funcoes.ajustarDinheiroDigitado(Double.parseDouble(Funcoes.funcoes.formatoParaInserir(tValor.getText())));
                } catch (ParseException ex) {
                    Logger.getLogger(Caixa.class.getName()).log(Level.SEVERE, null, ex);
                }
                if (tTipo.getSelectedIndex() == 1) {
                    mov.setValor("-" + valorAjustado);
                } else {
                    mov.setValor(valorAjustado);
                }

                mov.setData(data.getTime().toLocaleString().substring(0, 10));

                dtm.addRow(new Object[]{mov.getData(), mov.getDescricao(), mov.getValor(), mov.getTipo()});
                if (tTipo.getSelectedIndex() == 1) {
                    try {
                        mov.setValor("-" + Funcoes.funcoes.formatoParaInserir(tValor.getText()));
                    } catch (ParseException ex) {
                        Logger.getLogger(Caixa.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } else {
                    try {
                        mov.setValor(Funcoes.funcoes.formatoParaInserir(tValor.getText()));
                    } catch (ParseException ex) {
                        Logger.getLogger(Caixa.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                try {
                    tTotal.setText(Funcoes.funcoes.calculaTotal(entradas, 2, "0"));

                } catch (ParseException ex) {
                    Logger.getLogger(Caixa.class.getName()).log(Level.SEVERE, null, ex);
                }
                mov.setData(Funcoes.funcoes.paraInserirData(data.getTime().toLocaleString().substring(0, 10)));
                mov.setIddia(dia.getCodDia());
                fa.inserir_Movimentacao(mov,usu);
                Dia alteraSaldo = new Dia();
                alteraSaldo.setCodDia(dia.getCodDia());
                try {
                    alteraSaldo.setSaldo_atual(Funcoes.funcoes.formatoParaInserir(tTotal.getText().substring(3, tTotal.getText().length())));

                } catch (ParseException ex) {
                    Logger.getLogger(Caixa.class.getName()).log(Level.SEVERE, null, ex);
                }

                fa.alterarSaldo_Dia(alteraSaldo,usu);

                tDescricao.setText("");
                tValor.setText("");
                tTipo.setSelectedIndex(0);

            }
        });

        imprimir.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                fa = new Facade();
                try {
                    fa.fluxoCaixa_Relatorio(data.getTime().toLocaleString().substring(0, 10), Funcoes.funcoes.calculaTotal(entradas, 2, "+"), Funcoes.funcoes.calculaTotal(entradas, 2, "-"),usu);
                } catch (ParseException ex) {
                    Logger.getLogger(Caixa.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        });

        abrir.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                int resposta = JOptionPane.showConfirmDialog(null, "Deseja realmente abrir o caixa?");
                if (resposta == 0) {

                    fa = new Facade();
                    Dia abrirDia = new Dia();
                    Movimentacao mov = new Movimentacao();

                    if (fa.pegarSaldoAnterior_Dia(usu)== null) {
                        abrirDia.setSaldo_anterior("0");
                    } else {
                        abrirDia.setSaldo_anterior(fa.pegarSaldoAnterior_Dia(usu));
                    }
                    abrirDia.setDia_mes(Funcoes.funcoes.paraInserirData(data.getTime().toLocaleString().substring(0, 10)));
                    abrirDia.setSaldo_atual("0.0");
                    abrirDia.setSituacao(ValoresFixos.SituacaoDia.aberto.getSituacao());

                    dtm.addRow(new Object[]{data.getTime().toLocaleString().substring(0, 10), "Saldo Anterior", Funcoes.funcoes.paraFormatoDinheiro(Double.parseDouble(abrirDia.getSaldo_anterior())), " - "});
                    try {
                        tTotal.setText(Funcoes.funcoes.calculaTotal(entradas, 2, "0"));
                    } catch (ParseException ex) {
                        Logger.getLogger(Caixa.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    fa.abrirDia_Dia(abrirDia,usu);
                    Dia alteraSaldo = new Dia();
                    alteraSaldo.setCodDia(fa.verificarUltimoDia_Dia(usu).getCodDia());
                    try {
                        alteraSaldo.setSaldo_atual(Funcoes.funcoes.formatoParaInserir(tTotal.getText().substring(3, tTotal.getText().length())));

                    } catch (ParseException ex) {
                        Logger.getLogger(Caixa.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    fa.alterarSaldo_Dia(alteraSaldo,usu);
                    mov.setIddia(alteraSaldo.getCodDia());
                    mov.setTipo(" - ");
                    mov.setData(Funcoes.funcoes.paraInserirData(data.getTime().toLocaleString().substring(0, 10)));
                    mov.setValor(alteraSaldo.getSaldo_atual());
                    mov.setDescricao("Saldo Anterior");
                    fa.inserir_Movimentacao(mov,usu);
                    JOptionPane.showMessageDialog(null, "Caixa do dia " + data.getTime().toLocaleString().substring(0, 10) + " aberto com sucesso!!!");
                    abrir.setEnabled(false);
                    fechar.setEnabled(true);
                    tDescricao.setEditable(true);
                    tValor.setEditable(true);
                    tTipo.setEnabled(true);
                    inserir.setEnabled(true);
                    imprimir.setEnabled(false);
                }
            }
        });

        fechar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                int resposta = JOptionPane.showConfirmDialog(null, "Deseja realmente fechar o caixa?");
                if (resposta == 0) {

                    fa = new Facade();
                    Dia fecharDia = new Dia();
                    fecharDia.setCodDia(ultimoDia.getCodDia());
                    fa.fecharDia_Dia(fecharDia,usu);
                    JOptionPane.showMessageDialog(null, "Caixa do dia " + Funcoes.funcoes.paraRecuperarData(ultimoDia.getDia_mes()) + " fechado com sucesso!!!");
                    abrir.setEnabled(true);
                    fechar.setEnabled(false);
                    statusDia.setText("");
                    tTotal.setText("");
                    removeTudoMov(dtm.getRowCount());
                    situacaoDia(usu);
                }

            }
        });

        setLayout(null);
        setBackground(Color.LIGHT_GRAY);
        setBorder(BorderFactory.createBevelBorder(1, Color.DARK_GRAY, Color.DARK_GRAY));
        setSize(600, 400);
        setVisible(true);
        revalidate();
        repaint();

    }

    private void removeTudoMov(int rows) {

        for (int a = 0; a <= rows; a++) {
            while (dtm.getRowCount() != 0) {
                dtm.removeRow(0);
            }
        }

    }

    private void situacaoDia(Usuario usu) {
        fa = new Facade();
        ultimoDia = fa.verificarUltimoDia_Dia(usu);

        if (ultimoDia == null) {
            abrir.setEnabled(true);
        } else {
            if (data.getTime().toLocaleString().substring(0, 10).equalsIgnoreCase(Funcoes.funcoes.paraRecuperarData(ultimoDia.getDia_mes())) && ultimoDia.getSituacao().equalsIgnoreCase(ValoresFixos.SituacaoDia.fechado.getSituacao())) {

                statusDia.setText("O caixa de hoje, " + Funcoes.funcoes.paraRecuperarData(ultimoDia.getDia_mes()) + ", já foi fechado. \n ");
                preencheTabelaAbertos(fa.preencherAberto_Movimentacao(ultimoDia,usu));
                abrir.setEnabled(false);
                imprimir.setEnabled(true);
                try {
                    tTotal.setText(Funcoes.funcoes.calculaTotal(entradas, 2, "0"));

                } catch (ParseException ex) {
                    Logger.getLogger(Caixa.class.getName()).log(Level.SEVERE, null, ex);
                }

                fechar.setEnabled(false);
                tDescricao.setEditable(false);
                tValor.setEditable(false);
                tTipo.setEnabled(false);
                inserir.setEnabled(false);

            } else {

                if (data.getTime().toLocaleString().substring(0, 10).equalsIgnoreCase(Funcoes.funcoes.paraRecuperarData(ultimoDia.getDia_mes()))) {

                    {
                        fa = new Facade();
                        preencheTabelaAbertos(fa.preencherAberto_Movimentacao(ultimoDia,usu));

                        try {
                            tTotal.setText(Funcoes.funcoes.calculaTotal(entradas, 2, "0"));

                        } catch (ParseException ex) {
                            Logger.getLogger(Caixa.class.getName()).log(Level.SEVERE, null, ex);
                        }

                        fechar.setEnabled(true);

                    }

                } else {

                    if (ultimoDia.getSituacao().equalsIgnoreCase(ValoresFixos.SituacaoDia.fechado.getSituacao())) {

                        abrir.setEnabled(true);
                        tDescricao.setEditable(false);
                        tValor.setEditable(false);
                        tTipo.setEnabled(false);
                        inserir.setEnabled(false);

                    } else {

                       fa = new Facade();
                        preencheTabelaAbertos(fa.preencherAberto_Movimentacao(ultimoDia,usu));

                        try {
                            tTotal.setText(Funcoes.funcoes.calculaTotal(entradas, 2, "0"));

                        } catch (ParseException ex) {
                            Logger.getLogger(Caixa.class.getName()).log(Level.SEVERE, null, ex);
                        }

                        statusDia.setText("O caixa do dia " + Funcoes.funcoes.paraRecuperarData(ultimoDia.getDia_mes()) + " ainda não foi fechado. \n "
                                + "Feche-o para abrir o de hoje!!");
                        fechar.setEnabled(true);
                        tDescricao.setEditable(false);
                        tValor.setEditable(false);
                        tTipo.setEnabled(false);
                        inserir.setEnabled(false);
                        imprimir.setEnabled(false);

                    }

                }

            }
        }

    }

    private void preencheTabelaAbertos(Vector<Movimentacao> movimentacoes) {

        for (int a = 1; a <= movimentacoes.size(); a++) {

            dtm.addRow(new Object[]{Funcoes.funcoes.paraRecuperarData(movimentacoes.elementAt(a - 1).getData()), movimentacoes.elementAt(a - 1).getDescricao(), Funcoes.funcoes.ajustarDinheiroTabela(Double.parseDouble(movimentacoes.elementAt(a - 1).getValor())), movimentacoes.elementAt(a - 1).getTipo()});

        }
    }

}
